home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 701-725 / 708 / intuisup / intuisup42.lha / Intuisup / source.lha / Editor / source.c < prev    next >
C/C++ Source or Header  |  1992-06-22  |  35KB  |  1,105 lines

  1. /* $Revision Header *** Header built automatically - do not edit! ***********
  2.  *
  3.  *    (C) Copyright 1991 by Torsten Jürgeleit
  4.  *
  5.  *    Name .....: source.c
  6.  *    Created ..: Sunday 22-Dec-91 21:35:45
  7.  *    Revision .: 2
  8.  *
  9.  *    Date        Author                 Comment
  10.  *    =========   ====================   ====================
  11.  *    22-Jun-92   Torsten Jürgeleit      now window can be centered
  12.  *    21-Jun-92   Torsten Jürgeleit      `#include <functions.h>' only for
  13.  *                       Aztec C
  14.  *    22-Dec-91   Torsten Jürgeleit      Created this file!
  15.  *
  16.  ****************************************************************************
  17.  *
  18.  *    C source code generator
  19.  *
  20.  * $Revision Header ********************************************************/
  21.  
  22.     /* Includes */
  23.  
  24. #include "includes.h"
  25. #include "defines.h"
  26. #include "imports.h"
  27. #include "protos.h"
  28.  
  29.     /* Defines */
  30.  
  31. #define GADGET_TEXT    (gads ? gad_y : gad_n)
  32.  
  33.     /* Defines for source title */
  34.  
  35. #define SOURCE_TITLE_LEFT_EDGE    0
  36. #define SOURCE_TITLE_TOP_EDGE    5
  37. #define SOURCE_TITLE_TYPE    TEXT_DATA_TYPE_TEXT
  38. #define SOURCE_TITLE_FLAGS    (TEXT_DATA_FLAG_CENTER | TEXT_DATA_FLAG_BOLD)
  39. #define SOURCE_TITLE_TEXT    "Save C source code of project"
  40. #define SOURCE_TITLE_TEXT_ATTR    &topaz80_attr
  41.  
  42.     /* Defines for source gadgets */
  43.  
  44. #define SOURCE_SELECTION_OK    1
  45.  
  46. #define SOURCE_GADGET_OK    0
  47. #define SOURCE_GADGET_CANCEL    1
  48. #define SOURCE_GADGET_ID    2
  49. #define SOURCE_GADGET_STATIC    3
  50. #define SOURCE_GADGET_INNER    4
  51. #define SOURCE_GADGET_CENTER    5
  52. #define SOURCE_GADGET_WINDOW    6
  53. #define SOURCE_GADGET_PROGRAM    7
  54.  
  55. #define SOURCE_GADGET1_TYPE        GADGET_DATA_TYPE_BUTTON
  56. #define SOURCE_GADGET1_FLAGS        GADGET_DATA_FLAG_HOTKEY
  57. #define SOURCE_GADGET1_TEXT        "_Ok"
  58. #define SOURCE_GADGET1_LEFT_EDGE    ((EDITOR_WINDOW_WIDTH / 2 - SOURCE_GADGET1_WIDTH) / 2)
  59. #define SOURCE_GADGET1_TOP_EDGE        (EDITOR_WINDOW_HEIGHT - SOURCE_GADGET1_HEIGHT - 5)
  60. #define SOURCE_GADGET1_WIDTH        ((6 + 2) * 8)
  61. #define SOURCE_GADGET1_HEIGHT        15
  62. #define SOURCE_GADGET1_TEXT_ATTR    &topaz80_attr
  63.  
  64. #define SOURCE_GADGET2_TYPE        GADGET_DATA_TYPE_BUTTON
  65. #define SOURCE_GADGET2_FLAGS        GADGET_DATA_FLAG_HOTKEY
  66. #define SOURCE_GADGET2_TEXT        "_Cancel"
  67. #define SOURCE_GADGET2_LEFT_EDGE    (EDITOR_WINDOW_WIDTH / 2 + (EDITOR_WINDOW_WIDTH / 2 - SOURCE_GADGET1_WIDTH) / 2)
  68. #define SOURCE_GADGET2_TOP_EDGE        (EDITOR_WINDOW_HEIGHT - SOURCE_GADGET1_HEIGHT - 5)
  69. #define SOURCE_GADGET2_WIDTH        SOURCE_GADGET1_WIDTH
  70. #define SOURCE_GADGET2_HEIGHT        SOURCE_GADGET1_HEIGHT
  71. #define SOURCE_GADGET2_TEXT_ATTR    &topaz80_attr
  72.  
  73. #define SOURCE_GADGET3_TYPE        GADGET_DATA_TYPE_STRING
  74. #define SOURCE_GADGET3_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_TEXT_LEFT)
  75. #define SOURCE_GADGET3_LEFT_EDGE    (110 + (10 + 1) * 8)
  76. #define SOURCE_GADGET3_TOP_EDGE        22
  77. #define SOURCE_GADGET3_WIDTH        76
  78. #define SOURCE_GADGET3_HEIGHT        12
  79. #define SOURCE_GADGET3_TEXT        "Project I_D"
  80. #define SOURCE_GADGET3_TEXT_ATTR    &topaz80_attr
  81. #define SOURCE_GADGET3_INPUT_LEN    MAX_PROJECT_ID_LEN
  82. #define SOURCE_GADGET3_INPUT_ACTIVATE    0
  83. #define SOURCE_GADGET3_INPUT_DEFAULT    NULL
  84.  
  85. #define SOURCE_GADGET4_TYPE        GADGET_DATA_TYPE_CHECK
  86. #define SOURCE_GADGET4_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_TEXT_RIGHT)
  87. #define SOURCE_GADGET4_TEXT        "_Static data"
  88. #define SOURCE_GADGET4_LEFT_EDGE    (SOURCE_GADGET3_LEFT_EDGE + SOURCE_GADGET3_WIDTH + 50)
  89. #define SOURCE_GADGET4_TOP_EDGE        (SOURCE_GADGET3_TOP_EDGE + 1)
  90. #define SOURCE_GADGET4_WIDTH        0
  91. #define SOURCE_GADGET4_HEIGHT        0
  92. #define SOURCE_GADGET4_TEXT_ATTR    &topaz80_attr
  93.  
  94. #define SOURCE_GADGET5_TYPE        GADGET_DATA_TYPE_CHECK
  95. #define SOURCE_GADGET5_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_TEXT_RIGHT)
  96. #define SOURCE_GADGET5_TEXT        "_Inner window"
  97. #define SOURCE_GADGET5_LEFT_EDGE    SOURCE_GADGET4_LEFT_EDGE
  98. #define SOURCE_GADGET5_TOP_EDGE        (SOURCE_GADGET4_TOP_EDGE + 12)
  99. #define SOURCE_GADGET5_WIDTH        0
  100. #define SOURCE_GADGET5_HEIGHT        0
  101. #define SOURCE_GADGET5_TEXT_ATTR    &topaz80_attr
  102.  
  103. #define SOURCE_GADGET6_TYPE        GADGET_DATA_TYPE_CHECK
  104. #define SOURCE_GADGET6_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_TEXT_RIGHT)
  105. #define SOURCE_GADGET6_TEXT        "C_enter window"
  106. #define SOURCE_GADGET6_LEFT_EDGE    SOURCE_GADGET5_LEFT_EDGE
  107. #define SOURCE_GADGET6_TOP_EDGE        (SOURCE_GADGET5_TOP_EDGE + 12)
  108. #define SOURCE_GADGET6_WIDTH        0
  109. #define SOURCE_GADGET6_HEIGHT        0
  110. #define SOURCE_GADGET6_TEXT_ATTR    &topaz80_attr
  111.  
  112. #define SOURCE_GADGET7_TYPE        GADGET_DATA_TYPE_CHECK
  113. #define SOURCE_GADGET7_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_TEXT_RIGHT)
  114. #define SOURCE_GADGET7_TEXT        "_Window"
  115. #define SOURCE_GADGET7_LEFT_EDGE    SOURCE_GADGET6_LEFT_EDGE
  116. #define SOURCE_GADGET7_TOP_EDGE        (SOURCE_GADGET6_TOP_EDGE + 12)
  117. #define SOURCE_GADGET7_WIDTH        0
  118. #define SOURCE_GADGET7_HEIGHT        0
  119. #define SOURCE_GADGET7_TEXT_ATTR    &topaz80_attr
  120.  
  121. #define SOURCE_GADGET8_TYPE        GADGET_DATA_TYPE_CHECK
  122. #define SOURCE_GADGET8_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_TEXT_RIGHT)
  123. #define SOURCE_GADGET8_TEXT        "_Program"
  124. #define SOURCE_GADGET8_LEFT_EDGE    SOURCE_GADGET7_LEFT_EDGE
  125. #define SOURCE_GADGET8_TOP_EDGE        (SOURCE_GADGET7_TOP_EDGE + 14)
  126. #define SOURCE_GADGET8_WIDTH        0
  127. #define SOURCE_GADGET8_HEIGHT        0
  128. #define SOURCE_GADGET8_TEXT_ATTR    &topaz80_attr
  129.  
  130.     /* Statics for source requester */
  131.  
  132. STATIC struct GadgetData  source_gadget_data[] = {
  133.    {
  134.     SOURCE_GADGET1_TYPE,        /* gd_Type */
  135.     SOURCE_GADGET1_FLAGS,        /* gd_Flags */
  136.     SOURCE_GADGET1_LEFT_EDGE,    /* gd_LeftEdge */
  137.     SOURCE_GADGET1_TOP_EDGE,    /* gd_TopEdge */
  138.     SOURCE_GADGET1_WIDTH,        /* gd_Width */
  139.     SOURCE_GADGET1_HEIGHT,        /* gd_Height */
  140.     SOURCE_GADGET1_TEXT,        /* *gd_Text */
  141.     SOURCE_GADGET1_TEXT_ATTR,    /* *gd_TextAttr */
  142.     { 0, 0, 0 }
  143.    }, {
  144.     SOURCE_GADGET2_TYPE,        /* gd_Type */
  145.     SOURCE_GADGET2_FLAGS,        /* gd_Flags */
  146.     SOURCE_GADGET2_LEFT_EDGE,    /* gd_LeftEdge */
  147.     SOURCE_GADGET2_TOP_EDGE,    /* gd_TopEdge */
  148.     SOURCE_GADGET2_WIDTH,        /* gd_Width */
  149.     SOURCE_GADGET2_HEIGHT,        /* gd_Height */
  150.     SOURCE_GADGET2_TEXT,        /* *gd_Text */
  151.     SOURCE_GADGET2_TEXT_ATTR,    /* *gd_TextAttr */
  152.     { 0, 0, 0 }
  153.    }, {
  154.     SOURCE_GADGET3_TYPE,        /* gd_Type */
  155.     SOURCE_GADGET3_FLAGS,        /* gd_Flags */
  156.     SOURCE_GADGET3_LEFT_EDGE,    /* gd_LeftEdge */
  157.     SOURCE_GADGET3_TOP_EDGE,    /* gd_TopEdge */
  158.     SOURCE_GADGET3_WIDTH,        /* gd_Width */
  159.     SOURCE_GADGET3_HEIGHT,        /* gd_Height */
  160.     SOURCE_GADGET3_TEXT,        /* *gd_Text */
  161.     SOURCE_GADGET3_TEXT_ATTR,    /* *gd_TextAttr */
  162.     {
  163.     SOURCE_GADGET3_INPUT_LEN,    /* gd_InputLen */
  164.     SOURCE_GADGET3_INPUT_ACTIVATE,    /* gd_InputActivate */
  165.     SOURCE_GADGET3_INPUT_DEFAULT    /* gd_InputDefault */
  166.     }
  167.    }, {
  168.     SOURCE_GADGET4_TYPE,        /* gd_Type */
  169.     SOURCE_GADGET4_FLAGS,        /* gd_Flags */
  170.     SOURCE_GADGET4_LEFT_EDGE,    /* gd_LeftEdge */
  171.     SOURCE_GADGET4_TOP_EDGE,    /* gd_TopEdge */
  172.     SOURCE_GADGET4_WIDTH,        /* gd_Width */
  173.     SOURCE_GADGET4_HEIGHT,        /* gd_Height */
  174.     SOURCE_GADGET4_TEXT,        /* *gd_Text */
  175.     SOURCE_GADGET4_TEXT_ATTR,    /* *gd_TextAttr */
  176.     { 0, 0, 0 }
  177.    }, {
  178.     SOURCE_GADGET5_TYPE,        /* gd_Type */
  179.     SOURCE_GADGET5_FLAGS,        /* gd_Flags */
  180.     SOURCE_GADGET5_LEFT_EDGE,    /* gd_LeftEdge */
  181.     SOURCE_GADGET5_TOP_EDGE,    /* gd_TopEdge */
  182.     SOURCE_GADGET5_WIDTH,        /* gd_Width */
  183.     SOURCE_GADGET5_HEIGHT,        /* gd_Height */
  184.     SOURCE_GADGET5_TEXT,        /* *gd_Text */
  185.     SOURCE_GADGET5_TEXT_ATTR,    /* *gd_TextAttr */
  186.     { 0, 0, 0 }
  187.    }, {
  188.     SOURCE_GADGET6_TYPE,        /* gd_Type */
  189.     SOURCE_GADGET6_FLAGS,        /* gd_Flags */
  190.     SOURCE_GADGET6_LEFT_EDGE,    /* gd_LeftEdge */
  191.     SOURCE_GADGET6_TOP_EDGE,    /* gd_TopEdge */
  192.     SOURCE_GADGET6_WIDTH,        /* gd_Width */
  193.     SOURCE_GADGET6_HEIGHT,        /* gd_Height */
  194.     SOURCE_GADGET6_TEXT,        /* *gd_Text */
  195.     SOURCE_GADGET6_TEXT_ATTR,    /* *gd_TextAttr */
  196.     { 0, 0, 0 }
  197.    }, {
  198.     SOURCE_GADGET7_TYPE,        /* gd_Type */
  199.     SOURCE_GADGET7_FLAGS,        /* gd_Flags */
  200.     SOURCE_GADGET7_LEFT_EDGE,    /* gd_LeftEdge */
  201.     SOURCE_GADGET7_TOP_EDGE,    /* gd_TopEdge */
  202.     SOURCE_GADGET7_WIDTH,        /* gd_Width */
  203.     SOURCE_GADGET7_HEIGHT,        /* gd_Height */
  204.     SOURCE_GADGET7_TEXT,        /* *gd_Text */
  205.     SOURCE_GADGET7_TEXT_ATTR,    /* *gd_TextAttr */
  206.     { 0, 0, 0 }
  207.    }, {
  208.     SOURCE_GADGET8_TYPE,        /* gd_Type */
  209.     SOURCE_GADGET8_FLAGS,        /* gd_Flags */
  210.     SOURCE_GADGET8_LEFT_EDGE,    /* gd_LeftEdge */
  211.     SOURCE_GADGET8_TOP_EDGE,    /* gd_TopEdge */
  212.     SOURCE_GADGET8_WIDTH,        /* gd_Width */
  213.     SOURCE_GADGET8_HEIGHT,        /* gd_Height */
  214.     SOURCE_GADGET8_TEXT,        /* *gd_Text */
  215.     SOURCE_GADGET8_TEXT_ATTR,    /* *gd_TextAttr */
  216.     { 0, 0, 0 }
  217.    }, {
  218.     INTUISUP_DATA_END        /* mark end of gadget data */
  219.    }
  220. };
  221.     /* Save project as C source code */
  222.  
  223.    SHORT
  224. save_c_source(VOID)
  225. {
  226.    struct TemplateList  *tl = &template_list;
  227.    struct GadgetData    *gd = &source_gadget_data[0];
  228.    APTR   gl;
  229.    USHORT flags = tl->tl_Flags;
  230.    SHORT  status;
  231.  
  232.    /* Init gadgets with current project data */
  233.    (gd + SOURCE_GADGET_ID)->gd_SpecialData.gd_InputData.gd_InputDefault       = &tl->tl_ProjectID[0];
  234.    (gd + SOURCE_GADGET_STATIC)->gd_SpecialData.gd_CheckData.gd_CheckSelected  = (flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ? 1 : 0);
  235.    (gd + SOURCE_GADGET_INNER)->gd_SpecialData.gd_CheckData.gd_CheckSelected   = (flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ? 1 : 0);
  236.    (gd + SOURCE_GADGET_CENTER)->gd_SpecialData.gd_CheckData.gd_CheckSelected  = (flags & TEMPLATE_LIST_FLAG_SOURCE_CENTER_WINDOW ? 1 : 0);
  237.    (gd + SOURCE_GADGET_WINDOW)->gd_SpecialData.gd_CheckData.gd_CheckSelected  = (flags & TEMPLATE_LIST_FLAG_SOURCE_WINDOW ? 1 : 0);
  238.    (gd + SOURCE_GADGET_PROGRAM)->gd_SpecialData.gd_CheckData.gd_CheckSelected = (flags & TEMPLATE_LIST_FLAG_SOURCE_PROGRAM ? 1 : 0);
  239.  
  240.    /* Print title and display gadgets */
  241.    IClearWindow(eri, ewin, 0, 0, EDITOR_WINDOW_WIDTH, EDITOR_WINDOW_HEIGHT,
  242.                                      0);
  243.    IPrintText(eri, ewin, SOURCE_TITLE_TEXT, SOURCE_TITLE_LEFT_EDGE,
  244.            SOURCE_TITLE_TOP_EDGE, SOURCE_TITLE_TYPE, SOURCE_TITLE_FLAGS,
  245.                             SOURCE_TITLE_TEXT_ATTR);
  246.    if (!(gl = ICreateGadgets(eri, &source_gadget_data[0], 0, 0, NULL))) {
  247.       status = EDITOR_ERROR_OUT_OF_MEM;
  248.    } else {
  249.       IDisplayGadgets(ewin, gl);
  250.       status = save_c_source_action(gl, tl);
  251.       IRemoveGadgets(gl);
  252.       IFreeGadgets(gl);
  253.  
  254.       /* Generate C source */
  255.       if (status == SOURCE_SELECTION_OK) {
  256.      status = generate_c_source(tl);
  257.       }
  258.    }
  259.    return(status);
  260. }
  261.     /* Perform action for source code generator */
  262.  
  263.    STATIC SHORT
  264. save_c_source_action(APTR gl, struct TemplateList  *tl)
  265. {
  266.    struct MsgPort  *up = ewin->UserPort;
  267.    BYTE   *id = NULL;
  268.    USHORT flags = tl->tl_Flags;
  269.    BOOL   keepon = TRUE;
  270.    SHORT  status = EDITOR_STATUS_NORMAL;
  271.  
  272.    do {
  273.       struct IntuiMessage  *msg;
  274.  
  275.       WaitPort(up);
  276.       while (msg = IGetMsg(up)) {
  277.      ULONG value;
  278.  
  279.      switch (msg->Class) {
  280.         case CLOSEWINDOW :
  281.            status = EDITOR_STATUS_QUIT;
  282.            keepon = FALSE;
  283.            break;
  284.  
  285.         case ISUP_ID :
  286.            value = (ULONG)msg->IAddress;
  287.            switch (msg->Code) {
  288.           case SOURCE_GADGET_OK :
  289.  
  290.              /* Change template list data */
  291.              if (id) {
  292.             strcpy(&tl->tl_ProjectID[0], id);
  293.              }
  294.              tl->tl_Flags = flags;
  295.  
  296.              /* Set status to generate C source code */
  297.              status = SOURCE_SELECTION_OK;
  298.              keepon = FALSE;
  299.              break;
  300.  
  301.           case SOURCE_GADGET_CANCEL :
  302.              keepon = FALSE;
  303.              break;
  304.  
  305.           case SOURCE_GADGET_ID :
  306.              id     = (BYTE *)value;
  307.              flags |= TEMPLATE_LIST_FLAG_CHANGED;
  308.              break;
  309.  
  310.           case SOURCE_GADGET_STATIC :
  311.              if (value) {
  312.             flags |= TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA;
  313.              } else {
  314.             flags &= ~TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA;
  315.              }
  316.              flags |= TEMPLATE_LIST_FLAG_CHANGED;
  317.              break;
  318.  
  319.           case SOURCE_GADGET_INNER :
  320.              if (value) {
  321.             flags |= TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW;
  322.              } else {
  323.             flags &= ~TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW;
  324.              }
  325.              flags |= TEMPLATE_LIST_FLAG_CHANGED;
  326.              break;
  327.  
  328.           case SOURCE_GADGET_CENTER :
  329.              if (value) {
  330.             flags |= TEMPLATE_LIST_FLAG_SOURCE_CENTER_WINDOW;
  331.              } else {
  332.             flags &= ~TEMPLATE_LIST_FLAG_SOURCE_CENTER_WINDOW;
  333.              }
  334.              flags |= TEMPLATE_LIST_FLAG_CHANGED;
  335.              break;
  336.  
  337.           case SOURCE_GADGET_WINDOW :
  338.              if (value) {
  339.             flags |= TEMPLATE_LIST_FLAG_SOURCE_WINDOW;
  340.              } else {
  341.             flags &= ~TEMPLATE_LIST_FLAG_SOURCE_WINDOW;
  342.              }
  343.              flags |= TEMPLATE_LIST_FLAG_CHANGED;
  344.              break;
  345.  
  346.           case SOURCE_GADGET_PROGRAM :
  347.              if (value) {
  348.             flags |= TEMPLATE_LIST_FLAG_SOURCE_PROGRAM;
  349.             if (!(flags & TEMPLATE_LIST_FLAG_SOURCE_WINDOW)) {
  350.                flags |= TEMPLATE_LIST_FLAG_SOURCE_WINDOW;
  351.                ISetGadgetAttributes(gl, SOURCE_GADGET_WINDOW,
  352.                           0L, 0L, 1L, USE_CURRENT_VALUE,
  353.                          (VOID *)USE_CURRENT_VALUE);
  354.             }
  355.              } else {
  356.             flags &= ~TEMPLATE_LIST_FLAG_SOURCE_PROGRAM;
  357.              }
  358.              flags |= TEMPLATE_LIST_FLAG_CHANGED;
  359.              break;
  360.            }
  361.            break;
  362.      }
  363.      IReplyMsg(msg);
  364.       }
  365.    } while (keepon == TRUE);
  366.    return(status);
  367. }
  368.     /* C source code generator */
  369.  
  370.    STATIC SHORT
  371. generate_c_source(struct TemplateList  *tl)
  372. {
  373.    struct FileRequester  *freq = csource_file_requester;
  374.    SHORT status = EDITOR_STATUS_NORMAL;
  375.  
  376.    /* Display ARP file requester and check if user selected cancel */
  377.    IChangeMousePointer(ewin, NULL);
  378.    freq->fr_FuncFlags |= FRF_DoColor;
  379.    freq->fr_Hail       = CSOURCE_SAVE_HAIL_TEXT;
  380.    if (FileRequest(freq)) {
  381.       struct TemplateList  *tl = &template_list;
  382.       BPTR  fh;
  383.       BYTE  path[LONG_DSIZE + LONG_FSIZE + 1];
  384.       SHORT len = strlen(freq->fr_File) - 2;
  385.  
  386.       /* Prepare file name */
  387.       if (len < 1 || Strcmp(freq->fr_File + len, ".c")) {
  388.      strcat(freq->fr_File, ".c");
  389.      len += 2;
  390.       }
  391.  
  392.       /* Build full path for project file */
  393.       strcpy(&path[0], freq->fr_Dir);
  394.       TackOn(&path[0], freq->fr_File);
  395.  
  396.       /* Check if file already exists and inform user */
  397.       if (fh = Open(&path[0], (LONG)MODE_OLDFILE)) {
  398.      Close(fh);
  399.       }
  400.       if (!fh || ok_cancel_requester(" Save C source ", "File already"
  401.         " exists.\\n\\nDo you really want to overwrite?") == TRUE) {
  402.  
  403.      /* Open file and write C source */
  404.      if (!(fh = Open(&path[0], (LONG)MODE_NEWFILE))) {
  405.         status = EDITOR_ERROR_OPEN_FAILED;
  406.      } else {
  407.         if ((status = write_project_window(fh, tl)) ==
  408.                              EDITOR_STATUS_NORMAL) {
  409.            if ((status = write_project_borders(fh, tl)) ==
  410.                              EDITOR_STATUS_NORMAL) {
  411.           if ((status = write_project_fonts(fh, tl)) ==
  412.                              EDITOR_STATUS_NORMAL) {
  413.              if ((status = write_project_texts(fh, tl)) ==
  414.                              EDITOR_STATUS_NORMAL) {
  415.             if ((status = write_project_gadgets(fh, tl)) ==
  416.                              EDITOR_STATUS_NORMAL) {
  417.                status = write_project_program(fh, tl);
  418.             }
  419.              }
  420.           }
  421.            }
  422.         }
  423.         Close(fh);
  424.  
  425.         /* If any error then delete incomplete C source file */
  426.         if (status != EDITOR_STATUS_NORMAL) {
  427.            DeleteFile(&path[0]);
  428.         }
  429.      }
  430.       }
  431.    }
  432.    IRestoreMousePointer(ewin);
  433.    if (status != EDITOR_STATUS_NORMAL) {
  434.       show_error(status);
  435.    }
  436.    return(status);
  437. }
  438.     /* Write project window data to save file */
  439.  
  440.    STATIC SHORT
  441. write_project_window(BPTR fh, struct TemplateList  *tl)
  442. {
  443.    USHORT flags = tl->tl_Flags;
  444.    SHORT  status = EDITOR_STATUS_NORMAL;
  445.  
  446.    if (FPrintf(fh, "\t\t/* Project: %s */\n\n",
  447.                        &tl->tl_ProjectName[0]) == -1L) {
  448.       status = EDITOR_ERROR_WRITE_FAILED;
  449.    }
  450.    if (status == EDITOR_STATUS_NORMAL &&
  451.                 flags & TEMPLATE_LIST_FLAG_SOURCE_PROGRAM) {
  452.       if (FPrintf(fh,
  453.         "\t/* Includes */\n\n"
  454.         "#include <exec/types.h>\n"
  455.         "#include <exec/lists.h>\n"
  456.         "#include <intuition/intuition.h>\n"
  457.         "#include <libraries/intuisup.h>\n"
  458.         "#ifdef AZTEC_C\n"
  459.         "#include <functions.h>\n"
  460.         "#endif\n\n") == -1L) {
  461.      status = EDITOR_ERROR_WRITE_FAILED;
  462.       }
  463.    }
  464.    if (status == EDITOR_STATUS_NORMAL &&
  465.                  flags & TEMPLATE_LIST_FLAG_SOURCE_WINDOW) {
  466.       struct Window  *win = pwin;
  467.       BYTE id[MAX_PROJECT_ID_LEN];
  468.  
  469.       lower_string(&tl->tl_ProjectID[0], &id[0]);
  470.       if (FPrintf(fh,
  471.         "\t/* Defines and data for window */\n\n"
  472.         "#define RENDER_INFO_FLAGS  %d\n"
  473.         "#define OPEN_WINDOW_FLAGS  %d\n\n"
  474.         "#define WINDOW_LEFT_EDGE   %d\n"
  475.         "#define WINDOW_TOP_EDGE    %d\n"
  476.         "#define WINDOW_WIDTH       %d\n"
  477.         "#define WINDOW_HEIGHT      %d\n\n"
  478.         "%sstruct NewWindow  %s_new_window = {\n"
  479.         "   WINDOW_LEFT_EDGE, WINDOW_TOP_EDGE, WINDOW_WIDTH,"
  480.         " WINDOW_HEIGHT, 0, 1,\n"
  481.         "   CLOSEWINDOW | GADGET_IDCMP_FLAGS_ALL, WINDOWCLOSE |"
  482.         " WINDOWDRAG |\n"
  483.         "   WINDOWDEPTH | SMART_REFRESH | NOCAREREFRESH | ACTIVATE,"
  484.         " NULL, NULL,\n"
  485.         "   (UBYTE *)\"%s\", NULL, NULL, 0, 0, 0, 0, WBENCHSCREEN\n"
  486.         "};\n",
  487.               ((flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ?
  488.                     RENDER_INFO_FLAG_INNER_WINDOW : 0) |
  489.                      (flags & TEMPLATE_LIST_FLAG_BACK_FILL ?
  490.                        RENDER_INFO_FLAG_BACK_FILL : 0)),
  491.              ((flags & TEMPLATE_LIST_FLAG_SOURCE_CENTER_WINDOW ?
  492.                        OPEN_WINDOW_FLAG_CENTER_WINDOW : 0) |
  493.                  (flags & TEMPLATE_LIST_FLAG_RENDER_COLORS ?
  494.                      OPEN_WINDOW_FLAG_RENDER_PENS : 0)),
  495.                         win->LeftEdge, win->TopEdge,
  496.                (flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ?
  497.           win->Width - win->BorderLeft - win->BorderRight : win->Width),
  498.                (flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ?
  499.         win->Height - win->BorderTop - win->BorderBottom : win->Height),
  500.        (flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ? "STATIC " : ""),
  501.                    &id[0], &tl->tl_ProjectName[0]) == -1L) {
  502.      status = EDITOR_ERROR_WRITE_FAILED;
  503.       }
  504.    }
  505.    return(status);
  506. }
  507.     /* Write project border defines and data to save file */
  508.  
  509.    STATIC SHORT
  510. write_project_borders(BPTR fh, struct TemplateList  *tl)
  511. {
  512.    SHORT status = EDITOR_STATUS_NORMAL;
  513.  
  514.    if (tl->tl_BorderTemplates) {
  515.       if (FPrintf(fh, "\t/* Defines and data for borders */\n\n") == -1L) {
  516.          status = EDITOR_ERROR_WRITE_FAILED;
  517.       }
  518.       if (status == EDITOR_STATUS_NORMAL) {
  519.      struct Template  *tp;
  520.      BYTE   id[MAX_PROJECT_ID_LEN + 1];
  521.      USHORT count;
  522.  
  523.      /* Write defines */
  524.      upper_string(&tl->tl_ProjectID[0], &id[0]);
  525.      for (count = 0, tp = get_head((struct List *)&tl->tl_Templates);
  526.                        tp && status == EDITOR_STATUS_NORMAL;
  527.                      count++, tp = get_succ(&tp->tp_Node)) {
  528.         if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_BORDER) {
  529.            BYTE name[MAX_TEMPLATE_NAME_LEN + 1];
  530.  
  531.            upper_string(&tp->tp_TemplateName[0], &name[0]);
  532.            if (FPrintf(fh, "#define %s_BORDER_%s   %d\n",
  533.                       &id[0], &name[0], count) == -1L) {
  534.           status = EDITOR_ERROR_WRITE_FAILED;
  535.            }
  536.         }
  537.      }
  538.      if (status == EDITOR_STATUS_NORMAL) {
  539.         USHORT flags = tl->tl_Flags;
  540.  
  541.         /* Write border data */
  542.         lower_string(&tl->tl_ProjectID[0], &id[0]);
  543.         if (FPrintf(fh, "\n%sstruct BorderData  %s_border_data[] = {\n"
  544.                 "   {\n",
  545.                 (flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ?
  546.                       "STATIC " : ""), &id[0]) == -1L) {
  547.            status = EDITOR_ERROR_WRITE_FAILED;
  548.         } else {
  549.            struct Window  *win = pwin;
  550.  
  551.            for (tp = get_head((struct List *)&tl->tl_Templates);
  552.                        tp && status == EDITOR_STATUS_NORMAL;
  553.                           tp = get_succ(&tp->tp_Node)) {
  554.           if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_BORDER) {
  555.              struct BorderData  *bd = &tp->tp_Data.tp_BorderData;
  556.            
  557.              if (FPrintf(fh, "      %d, %d, %d, %d, %d\n"
  558.                      "   }, {\n", bd->bd_Type,
  559.                (flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ?
  560.                      bd->bd_LeftEdge - win->BorderLeft :
  561.                                bd->bd_LeftEdge),
  562.                (flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ?
  563.                        bd->bd_TopEdge - win->BorderTop :
  564.                                 bd->bd_TopEdge),
  565.                       bd->bd_Width, bd->bd_Height) == -1L) {
  566.             status = EDITOR_ERROR_WRITE_FAILED;
  567.              }
  568.           }
  569.            }
  570.            if (status == EDITOR_STATUS_NORMAL) {
  571.           if (FPrintf(fh, "      INTUISUP_DATA_END\n"
  572.                   "   }\n"
  573.                   "};\n") == -1L) {
  574.              status = EDITOR_ERROR_WRITE_FAILED;
  575.           }
  576.            }
  577.         }
  578.      }
  579.       }
  580.    }
  581.    return(status);
  582. }
  583.     /* Write project font data to save file */
  584.  
  585.    STATIC SHORT
  586. write_project_fonts(BPTR fh, struct TemplateList  *tl)
  587. {
  588.    SHORT status = EDITOR_STATUS_NORMAL;
  589.  
  590.    if (tl->tl_TextTemplates || tl->tl_GadgetTemplates) {
  591.       BYTE id[MAX_PROJECT_ID_LEN + 1];
  592.  
  593.       lower_string(&tl->tl_ProjectID[0], &id[0]);
  594.       if (FPrintf(fh, "\t/* Data for fonts */\n\n"
  595.               "%sstruct TextAttr  %s_text_attr[] = {\n"
  596.               "   {\n",
  597.              (tl->tl_Flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ?
  598.                       "STATIC " : ""), &id[0]) == -1L) {
  599.      status = EDITOR_ERROR_WRITE_FAILED;
  600.       } else {
  601.      struct TemplateFont  *tf = get_head((struct List *)&tl->tl_Fonts);
  602.  
  603.      while (tf && status == EDITOR_STATUS_NORMAL) {
  604.         struct TextAttr  *ta = &tf->tf_TextAttr;
  605.            
  606.         tf = get_succ((struct Node *)&tf->tf_MinNode);
  607.         if (FPrintf(fh, "      (STRPTR)\"%s\", %d, FS_NORMAL, FPF_ROMFONT\n"
  608.                 "   }%s", ta->ta_Name, ta->ta_YSize,
  609.                     (tf ? ", {\n" : "\n};\n")) == -1L) {
  610.            status = EDITOR_ERROR_WRITE_FAILED;
  611.         }
  612.      }
  613.       }
  614.    }
  615.    return(status);
  616. }
  617.     /* Write project text defines and data to save file */
  618.  
  619.    STATIC SHORT
  620. write_project_texts(BPTR fh, struct TemplateList  *tl)
  621. {
  622.    SHORT status = EDITOR_STATUS_NORMAL;
  623.  
  624.    if (tl->tl_TextTemplates) {
  625.       if (FPrintf(fh, "\t/* Defines and data for texts */\n\n") == -1L) {
  626.      status = EDITOR_ERROR_WRITE_FAILED;
  627.       }
  628.       if (status == EDITOR_STATUS_NORMAL) {
  629.      struct Template  *tp;
  630.      BYTE   id[MAX_PROJECT_ID_LEN + 1];
  631.      USHORT count;
  632.  
  633.      /* Write defines */
  634.      upper_string(&tl->tl_ProjectID[0], &id[0]);
  635.      for (count = 0, tp = get_head((struct List *)&tl->tl_Templates);
  636.                        tp && status == EDITOR_STATUS_NORMAL;
  637.                           tp = get_succ(&tp->tp_Node)) {
  638.         if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_TEXT) {
  639.            BYTE name[MAX_TEMPLATE_NAME_LEN + 1];
  640.  
  641.            upper_string(&tp->tp_TemplateName[0], &name[0]);
  642.            if (FPrintf(fh, "#define %s_TEXT_%s   %d\n",
  643.                       &id[0], &name[0], count) == -1L) {
  644.           status = EDITOR_ERROR_WRITE_FAILED;
  645.            } else {
  646.           count++;
  647.            }
  648.         }
  649.      }
  650.      if (status == EDITOR_STATUS_NORMAL) {
  651.         USHORT flags = tl->tl_Flags;
  652.  
  653.         /* Write text data */
  654.         lower_string(&tl->tl_ProjectID[0], &id[0]);
  655.         if (FPrintf(fh, "\n%sstruct TextData  %s_text_data[] = {\n"
  656.                 "   {\n",
  657.                 (flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ?
  658.                       "STATIC " : ""), &id[0]) == -1L) {
  659.            status = EDITOR_ERROR_WRITE_FAILED;
  660.         } else {
  661.            struct Window  *win = pwin;
  662.  
  663.            for (tp = get_head((struct List *)&tl->tl_Templates);
  664.                        tp && status == EDITOR_STATUS_NORMAL;
  665.                           tp = get_succ(&tp->tp_Node)) {
  666.           if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_TEXT) {
  667.              struct TextData  *td = &tp->tp_Data.tp_TextData;
  668.            
  669.              if (FPrintf(fh, "      %d, %d, %d, %d,\n"
  670.                      "      \"%s\", &%s_text_attr[%d]\n"
  671.                      "   }, {\n", td->td_Type, td->td_Flags,
  672.                (flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ?
  673.                      td->td_LeftEdge - win->BorderLeft :
  674.                                td->td_LeftEdge),
  675.                (flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ?
  676.                        td->td_TopEdge - win->BorderTop :
  677.                                 td->td_TopEdge),
  678.                   td->td_Text, &id[0], get_template_font_num(tl,
  679.                          td->td_TextAttr)) == -1L) {
  680.             status = EDITOR_ERROR_WRITE_FAILED;
  681.              }
  682.           }
  683.            }
  684.            if (status == EDITOR_STATUS_NORMAL) {
  685.           if (FPrintf(fh, "      INTUISUP_DATA_END\n"
  686.                   "   }\n"
  687.                   "};\n") == -1L) {
  688.              status = EDITOR_ERROR_WRITE_FAILED;
  689.           }
  690.            }
  691.         }
  692.      }
  693.       }
  694.    }
  695.    return(status);
  696. }
  697.     /* Write project gadget defines and data to save file */
  698.  
  699.    STATIC SHORT
  700. write_project_gadgets(BPTR fh, struct TemplateList  *tl)
  701. {
  702.    SHORT status = EDITOR_STATUS_NORMAL;
  703.  
  704.    if (tl->tl_GadgetTemplates) {
  705.       if (FPrintf(fh, "\t/* Defines and data for gadgets */\n\n") == -1L) {
  706.      status = EDITOR_ERROR_WRITE_FAILED;
  707.       }
  708.       if (status == EDITOR_STATUS_NORMAL) {
  709.      struct Template  *tp;
  710.      BYTE   id[MAX_PROJECT_ID_LEN + 1];
  711.          USHORT count;
  712.  
  713.      /* Write defines */
  714.      upper_string(&tl->tl_ProjectID[0], &id[0]);
  715.      for (count = 0, tp = get_head((struct List *)&tl->tl_Templates);
  716.                        tp && status == EDITOR_STATUS_NORMAL;
  717.                           tp = get_succ(&tp->tp_Node)) {
  718.         if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_GADGET) {
  719.            BYTE name[MAX_TEMPLATE_NAME_LEN + 1];
  720.  
  721.            upper_string(&tp->tp_TemplateName[0], &name[0]);
  722.            if (FPrintf(fh, "#define %s_GADGET_%s   %d\n%s",
  723.                       &id[0], &name[0], count) == -1L) {
  724.           status = EDITOR_ERROR_WRITE_FAILED;
  725.            } else {
  726.           count++;
  727.            }
  728.         }
  729.      }
  730.      if (status == EDITOR_STATUS_NORMAL) {
  731.         if (FPrintf(fh, "\n") == -1L) {
  732.            status = EDITOR_ERROR_WRITE_FAILED;
  733.         } else {
  734.     
  735.            /* Write text arrays and lists */
  736.            lower_string(&tl->tl_ProjectID[0], &id[0]);
  737.            for (count = 1, tp = get_head((struct List *)&tl->tl_Templates);
  738.                        tp && status == EDITOR_STATUS_NORMAL;
  739.                           tp = get_succ(&tp->tp_Node)) {
  740.           if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_GADGET) {
  741.              struct GadgetData  *gd = &tp->tp_Data.tp_GadgetData;
  742.  
  743.              switch (gd->gd_Type) {
  744.             case GADGET_DATA_TYPE_MX :
  745.                status = write_gadget_text_array(fh, tl, &id[0], count,
  746.                    gd->gd_SpecialData.gd_MXData.gd_MXTextArray);
  747.                break;
  748.  
  749.             case GADGET_DATA_TYPE_CYCLE :
  750.                status = write_gadget_text_array(fh, tl, &id[0], count,
  751.                gd->gd_SpecialData.gd_CycleData.gd_CycleTextArray);
  752.                break;
  753.  
  754.             case GADGET_DATA_TYPE_LISTVIEW :
  755.                status = write_gadget_list(fh, tl, &id[0], count,
  756.                gd->gd_SpecialData.gd_ListViewData.gd_ListViewList);
  757.                break;
  758.              }
  759.              count++;
  760.           }
  761.            }
  762.            if (status == EDITOR_STATUS_NORMAL) {
  763.           USHORT flags = tl->tl_Flags;
  764.  
  765.           /* Write gadget data */
  766.           if (FPrintf(fh, "%sstruct GadgetData  %s_gadget_data[] = {\n"
  767.                   "   {\n",
  768.                 (flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ?
  769.                       "STATIC " : ""), &id[0]) == -1L) {
  770.              status = EDITOR_ERROR_WRITE_FAILED;
  771.           } else {
  772.              struct Window  *win = pwin;
  773.  
  774.              for (count = 1, tp = get_head((struct List *)
  775.                              &tl->tl_Templates);
  776.                        tp && status == EDITOR_STATUS_NORMAL;
  777.                           tp = get_succ(&tp->tp_Node)) {
  778.             if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_GADGET) {
  779.                struct GadgetData  *gd = &tp->tp_Data.tp_GadgetData;
  780.            
  781.                if (FPrintf(fh, "      %ld, %ld, %d, %d, %d, %d,\n"
  782.                        "      \"%s\", &%s_text_attr[%d],\n",
  783.                           gd->gd_Type, gd->gd_Flags,
  784.                 (flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ?
  785.                      gd->gd_LeftEdge - win->BorderLeft :
  786.                                gd->gd_LeftEdge),
  787.                 (flags & TEMPLATE_LIST_FLAG_SOURCE_INNER_WINDOW ?
  788.                        gd->gd_TopEdge - win->BorderTop :
  789.                                 gd->gd_TopEdge),
  790.                    gd->gd_Width, gd->gd_Height, gd->gd_Text,
  791.                        &id[0], get_template_font_num(tl,
  792.                          gd->gd_TextAttr)) == -1L) {
  793.                   status = EDITOR_ERROR_WRITE_FAILED;
  794.                } else {
  795.                   if ((status = write_gadget_special_data(fh, &id[0],
  796.                       count, gd)) == EDITOR_STATUS_NORMAL) {
  797.                  count++;
  798.                   }
  799.                }
  800.             }
  801.              }
  802.              if (status == EDITOR_STATUS_NORMAL) {
  803.             if (FPrintf(fh, "      INTUISUP_DATA_END\n"
  804.                     "   }\n"
  805.                     "};\n") == -1L) {
  806.                status = EDITOR_ERROR_WRITE_FAILED;
  807.             }
  808.              }
  809.           }
  810.            }
  811.         }
  812.      }
  813.       }
  814.    }
  815.    return(status);
  816. }
  817.     /* Write gadget text array to save file*/
  818.  
  819.    STATIC SHORT
  820. write_gadget_text_array(BPTR fh, struct TemplateList  *tl, BYTE *id,
  821.                          USHORT count, BYTE **array)
  822. {
  823.    SHORT status = EDITOR_STATUS_NORMAL;
  824.  
  825.    if (FPrintf(fh, "%sBYTE *%s_gadget%d_text_array[] = {\n",
  826.              (tl->tl_Flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ?
  827.                        "STATIC " : ""), id, count) == -1L) {
  828.       status = EDITOR_ERROR_WRITE_FAILED;
  829.    } else {
  830.       BYTE *text;
  831.  
  832.       while ((text = *array++) && status == EDITOR_STATUS_NORMAL) {
  833.      if (FPrintf(fh, "   \"%s\",\n", text) == -1L) {
  834.         status = EDITOR_ERROR_WRITE_FAILED;
  835.      }
  836.       }
  837.       if (status == EDITOR_STATUS_NORMAL) {
  838.      if (FPrintf(fh, "   NULL\n"
  839.              "};\n") == -1L) {
  840.         status = EDITOR_ERROR_WRITE_FAILED;
  841.      }
  842.       }
  843.    }
  844.    return(status);
  845. }
  846.     /* Write gadget list to save file*/
  847.  
  848.    STATIC SHORT
  849. write_gadget_list(BPTR fh, struct TemplateList  *tl, BYTE *id, USHORT count,
  850.                              struct List  *list)
  851. {
  852.    USHORT num = 0;
  853.    SHORT status = EDITOR_STATUS_NORMAL;
  854.  
  855.    if (list->lh_Head->ln_Succ) {
  856.       if (FPrintf(fh, "IMPORT struct List  %s_gadget%d_list;\n"
  857.               "%sstruct Node  %s_gadget%d_node[] = {\n"
  858.               "   {\n", id, count,
  859.              (tl->tl_Flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ?
  860.                        "STATIC " : ""), id, count) == -1L) {
  861.      status = EDITOR_ERROR_WRITE_FAILED;
  862.       } else {
  863.      struct Node  *node = get_head(list);
  864.  
  865.      /* Write node array */
  866.      while (node && status == EDITOR_STATUS_NORMAL) {
  867.         BYTE *text = node->ln_Name;
  868.  
  869.         /* Write node pred */
  870.         node = get_succ(node);
  871.         if (node) {
  872.            if (FPrintf(fh, "      &%s_gadget%d_node[%d], ",
  873.                        &id[0], count, num + 1) == -1L) {
  874.           status = EDITOR_ERROR_WRITE_FAILED;
  875.            }
  876.         } else {
  877.            if (FPrintf(fh, "      (struct Node *)"
  878.              "&%s_gadget%d_list.lh_Tail, ", &id[0], count) == -1L) {
  879.           status = EDITOR_ERROR_WRITE_FAILED;
  880.            }
  881.         }
  882.         if (status == EDITOR_STATUS_NORMAL) {
  883.  
  884.            /* Write node succ */
  885.            if (num) {
  886.           if (FPrintf(fh, "&%s_gadget%d_node[%d]",
  887.                        &id[0], count, num - 1) == -1L) {
  888.              status = EDITOR_ERROR_WRITE_FAILED;
  889.           }
  890.            } else {
  891.           if (FPrintf(fh, "(struct Node *)&%s_gadget%d_list.lh_Head",
  892.                             &id[0], count) == -1L) {
  893.              status = EDITOR_ERROR_WRITE_FAILED;
  894.           }
  895.            }
  896.            if (status == EDITOR_STATUS_NORMAL) {
  897.  
  898.           /* Write node text */
  899.           if (FPrintf(fh, ", 0, 0,\n"
  900.                   "      \"%s\"\n"
  901.                   "   }%s", text,
  902.                       (node ? ", {\n" : "\n};\n")) == -1L) {
  903.              status = EDITOR_ERROR_WRITE_FAILED;
  904.           } else {
  905.              num++;
  906.           }
  907.            }
  908.         }
  909.      }
  910.       }
  911.    }
  912.    if (status == EDITOR_STATUS_NORMAL) {
  913.  
  914.       /* Write list */
  915.       if (FPrintf(fh, "%sstruct List  %s_gadget%d_list = {\n",
  916.              (tl->tl_Flags & TEMPLATE_LIST_FLAG_SOURCE_STATIC_DATA ?
  917.                  "/* STATIC */ " : ""), id, count) == -1L) {
  918.      status = EDITOR_ERROR_WRITE_FAILED;
  919.       } else {
  920.  
  921.      /* Write list head */
  922.      if (num) {
  923.         if (FPrintf(fh, "   &%s_gadget%d_node[0], NULL,\n",
  924.                             id, count) == -1L) {
  925.            status = EDITOR_ERROR_WRITE_FAILED;
  926.         }
  927.      } else {
  928.         if (FPrintf(fh, "   (struct Node *)&%s_gadget%d_list.lh_Tail,"
  929.                 " NULL,\n", id, count) == -1L) {
  930.            status = EDITOR_ERROR_WRITE_FAILED;
  931.         }
  932.      }
  933.      if (status == EDITOR_STATUS_NORMAL) {
  934.  
  935.         /* Write list tail */
  936.         if (num) {
  937.            if (FPrintf(fh, "   &%s_gadget%d_node[%d]",
  938.                            id, count, num - 1) == -1L) {
  939.           status = EDITOR_ERROR_WRITE_FAILED;
  940.            }
  941.         } else {
  942.            if (FPrintf(fh, "   (struct Node *)&%s_gadget%d_list.lh_Head",
  943.                             id, count) == -1L) {
  944.           status = EDITOR_ERROR_WRITE_FAILED;
  945.            }
  946.         }
  947.         if (status == EDITOR_STATUS_NORMAL) {
  948.  
  949.            /* Write list type */
  950.            if (FPrintf(fh, ", 0, 0\n"
  951.                    "};\n") == -1L) {
  952.           status = EDITOR_ERROR_WRITE_FAILED;
  953.            }
  954.         }
  955.      }
  956.       }
  957.    }
  958.    return(status);
  959. }
  960.     /* Write special gadget data */
  961.  
  962.    STATIC SHORT
  963. write_gadget_special_data(BPTR fh, BYTE *id, USHORT count,
  964.                              struct GadgetData  *gd)
  965. {
  966.    SHORT status = EDITOR_STATUS_NORMAL;
  967.  
  968.    if (FPrintf(fh, "      { ") == -1L) {
  969.       status = EDITOR_ERROR_WRITE_FAILED;
  970.    } else {
  971.       switch (gd->gd_Type) {
  972.      case GADGET_DATA_TYPE_MX :
  973.      case GADGET_DATA_TYPE_CYCLE :
  974.         if (FPrintf(fh, "%ld, %ld, &%s_gadget%d_text_array[0]",
  975.                     gd->gd_SpecialData.gd_Data.gd_Data1,
  976.            gd->gd_SpecialData.gd_Data.gd_Data2, id, count) == -1L) {
  977.            status = EDITOR_ERROR_WRITE_FAILED;
  978.         }
  979.         break;
  980.  
  981.      case GADGET_DATA_TYPE_STRING :
  982.         if (FPrintf(fh, "%ld, %ld, \"%s\"",
  983.                     gd->gd_SpecialData.gd_Data.gd_Data1,
  984.                     gd->gd_SpecialData.gd_Data.gd_Data2,
  985.                   gd->gd_SpecialData.gd_Data.gd_Data3) == -1L) {
  986.            status = EDITOR_ERROR_WRITE_FAILED;
  987.         }
  988.         break;
  989.  
  990.      case GADGET_DATA_TYPE_LISTVIEW :
  991.         if (FPrintf(fh, "%ld, %ld, &%s_gadget%d_list",
  992.                     gd->gd_SpecialData.gd_Data.gd_Data1,
  993.            gd->gd_SpecialData.gd_Data.gd_Data2, id, count) == -1L) {
  994.            status = EDITOR_ERROR_WRITE_FAILED;
  995.         }
  996.         break;
  997.  
  998.      default :
  999.         if (FPrintf(fh, "%ld, %ld, (VOID *)%ld",
  1000.                     gd->gd_SpecialData.gd_Data.gd_Data1,
  1001.                     gd->gd_SpecialData.gd_Data.gd_Data2,
  1002.                   gd->gd_SpecialData.gd_Data.gd_Data3) == -1L) {
  1003.            status = EDITOR_ERROR_WRITE_FAILED;
  1004.         }
  1005.         break;
  1006.       }
  1007.       if (status == EDITOR_STATUS_NORMAL) {
  1008.      if (FPrintf(fh, " }\n"
  1009.              "   }, {\n") == -1L) {
  1010.         status = EDITOR_ERROR_WRITE_FAILED;
  1011.      }
  1012.       }
  1013.    }
  1014.    return(status);
  1015. }
  1016.     /* Write project test program */
  1017.  
  1018.    STATIC SHORT
  1019. write_project_program(BPTR fh, struct TemplateList  *tl)
  1020. {
  1021.    SHORT status = EDITOR_STATUS_NORMAL;
  1022.  
  1023.    if (tl->tl_Flags & TEMPLATE_LIST_FLAG_SOURCE_PROGRAM) {
  1024.       BYTE   id[MAX_PROJECT_ID_LEN + 1];
  1025.       USHORT gads = tl->tl_GadgetTemplates;
  1026.  
  1027.       lower_string(&tl->tl_ProjectID[0], &id[0]);
  1028.       if (FPrintf(fh,
  1029.         "\nstruct Library  *IntuiSupBase;\n\n"
  1030.         "\t/* Test program */\n\n"
  1031.         "   LONG\n"
  1032.         "main(VOID)\n"
  1033.         "{\n"
  1034.         "   struct Window  *win;\n"
  1035.         "   APTR ri%s;\n"
  1036.         "\n"
  1037.         "   if (IntuiSupBase = OpenLibrary(IntuiSupName,"
  1038.         " IntuiSupVersion)) {\n"
  1039.         "      if (ri = IGetRenderInfo(NULL, RENDER_INFO_FLAGS)) {\n"
  1040.         "         if (win = IOpenWindow(ri, &%s_new_window,"
  1041.         " OPEN_WINDOW_FLAGS)) {\n",
  1042.                      (gads ? ", gl" : ""), &id[0]) == -1L) {
  1043.      status = EDITOR_ERROR_WRITE_FAILED;
  1044.       } else {
  1045.      if (gads && FPrintf(fh,
  1046.         "            if (gl = ICreateGadgets(ri,"
  1047.         " &%s_gadget_data[0], 0, 0, NULL)) {\n", &id[0]) == -1L) {
  1048.         status = EDITOR_ERROR_WRITE_FAILED;
  1049.      } else {
  1050.         BYTE *gad_y = "   ", *gad_n = "";
  1051.  
  1052.         if (FPrintf(fh,
  1053.             "%s            BOOL keepon = TRUE;\n"
  1054.             "\n", GADGET_TEXT) == -1L) {
  1055.            status = EDITOR_ERROR_WRITE_FAILED;
  1056.         } else {
  1057.            if ((tl->tl_BorderTemplates && FPrintf(fh,
  1058.             "%s            IDisplayBorders(ri, win,"
  1059.             " &%s_border_data[0], 0, 0);\n",
  1060.                          GADGET_TEXT, &id[0]) == -1L) ||
  1061.            (tl->tl_TextTemplates && FPrintf(fh,
  1062.             "%s            IDisplayTexts(ri, win,"
  1063.             " &%s_text_data[0], 0, 0, NULL);\n",
  1064.                          GADGET_TEXT, &id[0]) == -1L) ||
  1065.            (gads && FPrintf(fh,
  1066.             "               IDisplayGadgets(win,"
  1067.             " gl);\n") == -1L)) {
  1068.           status = EDITOR_ERROR_WRITE_FAILED;
  1069.            } else {
  1070.           if (FPrintf(fh,
  1071.             "%s            do {\n"
  1072.             "%s               struct IntuiMessage  *msg;\n\n"
  1073.             "%s               WaitPort(win->UserPort);\n"
  1074.             "%s               while (msg = IGetMsg(win->UserPort)) {\n"
  1075.             "%s                  if (msg->Class == CLOSEWINDOW) {\n"
  1076.             "%s                     keepon = FALSE;\n"
  1077.             "%s                  }\n"
  1078.             "%s                  IReplyMsg(msg);\n"
  1079.             "%s               }\n"
  1080.             "%s            } while (keepon == TRUE);\n"
  1081.             "%s"
  1082.             "            ICloseWindow(win, FALSE);\n"
  1083.             "         }\n"
  1084.             "         IFreeRenderInfo(ri);\n"
  1085.             "      }\n"
  1086.             "      CloseLibrary(IntuiSupBase);\n"
  1087.             "   }\n"
  1088.             "   return(0L);\n"
  1089.             "}\n",
  1090.              GADGET_TEXT, GADGET_TEXT, GADGET_TEXT, GADGET_TEXT,
  1091.              GADGET_TEXT, GADGET_TEXT, GADGET_TEXT, GADGET_TEXT,
  1092.                            GADGET_TEXT, GADGET_TEXT,
  1093.              (gads ? "               IRemoveGadgets(gl);\n"
  1094.                  "               IFreeGadgets(gl);\n"
  1095.                  "            }\n" : gad_n)) == -1L) {
  1096.              status = EDITOR_ERROR_WRITE_FAILED;
  1097.           }
  1098.            }
  1099.         }
  1100.      }
  1101.       }
  1102.    }
  1103.    return(status);
  1104. }
  1105.